//package org.mspring.mlog.service.impl;
//
//import java.util.Date;
//import java.util.List;
//
//import org.hibernate.Criteria;
//import org.hibernate.Query;
//import org.hibernate.Session;
//import org.hibernate.criterion.Restrictions;
//import org.mspring.mlog.entity.Attachment;
//import org.mspring.mlog.entity.Comment;
//import org.mspring.mlog.entity.Post;
//import org.mspring.mlog.service.AttachmentService;
//import org.mspring.mlog.service.CatalogService;
//import org.mspring.mlog.service.PostService;
//import org.mspring.platform.dao.hibernate.GenericDao;
//import org.mspring.platform.dao.support.Order;
//import org.mspring.platform.dao.support.Page;
//import org.mspring.platform.utils.StringUtils;
//import org.mspring.security.SecurityUtils;
//import org.springframework.beans.factory.annotation.Autowired;
//import org.springframework.stereotype.Service;
//import org.springframework.transaction.annotation.Transactional;
//
///**
// * 
// * @author Gao Youbo
// * @since 2012-7-18
// */
//@Service
//@Transactional
//public class PostServiceImpl extends GenericDao<Post, java.lang.Long> implements PostService {
//
//    @Autowired
//    private CatalogService catalogService;
//    @Autowired
//    private AttachmentService attachmentService;
//
//    @Override
//    public Post createPost(Post post) {
//        // TODO Auto-generated method stub
//        if (post.getCreateTime() == null) {
//            post.setCreateTime(new Date());
//        }
//        if (StringUtils.isBlank(post.getCommentStatus())) {
//            post.setCommentStatus(Post.CommentStatus.OPEN);
//        }
//        if (StringUtils.isBlank(post.getStatus())) {
//            post.setStatus(Post.Status.PUBLISH);
//        }
//        if (post.getReplys() == null) {
//            post.setReplys(new Long(0));
//        }
//        if (post.getIsTop() == null) {
//            post.setIsTop(false);
//        }
//        if (post.getAuthor() == null) {
//            post.setAuthor(SecurityUtils.getCurrentUser());
//        }
//        post.setReplys(new Long(0));
//        post.setViews(new Long(0));
//        return merge(post);
//    }
//
//    @Override
//    public void discardPost(Long... idArray) {
//        // TODO Auto-generated method stub
//        for (Long id : idArray) {
//            String hql = "update Post post set post.status = ? where post.id = ?";
//            executeUpdate(hql, new Object[] { Post.Status.TRASH, id });
//        }
//    }
//
//    @Override
//    public void trash2Publish(Long... idArray) {
//        // TODO Auto-generated method stub
//        for (Long id : idArray) {
//            String hql = "update Post post set post.status = ? where post.id = ? and post.status = ?";
//            executeUpdate(hql, new Object[] { Post.Status.PUBLISH, id, Post.Status.TRASH });
//        }
//    }
//
//    @Override
//    public Page<Post> findPostByTag(Page<Post> page, Long tag) {
//        // TODO Auto-generated method stub
//        if (page == null) {
//            page = new Page<Post>();
//        }
//        if (page.getSort() == null) {
//            page.setSort(new Order("postTag.PK.post.id", Order.OrderType.DESC));
//        }
//        if (tag != null) {
//            listPage("select postTag.PK.post from PostTag postTag where postTag.PK.tag.id = ? and postTag.PK.post.status = ? order by postTag.PK.post.isTop desc, postTag.PK.post.id desc", page, new Object[] { tag, Post.Status.PUBLISH });
//        }
//        return page;
//    }
//
//    @Override
//    public Page<Post> findPostByCatalog(Page<Post> page, Long catalog) {
//        // TODO Auto-generated method stub
//        if (page == null) {
//            page = new Page<Post>();
//        }
//        if (page.getSort() == null) {
//            page.setSort(new Order("postCatalog.PK.post.id", Order.OrderType.DESC));
//        }
//        if (catalog != null) {
//            listPage("select postCatalog.PK.post from PostCatalog postCatalog where postCatalog.PK.catalog.id = ? and postCatalog.PK.post.status = ? order by postCatalog.PK.post.isTop desc, postCatalog.PK.post.id desc", page, catalog, Post.Status.PUBLISH);
//        }
//        return page;
//    }
//
//    @Override
//    public void updatePost(Post post) {
//        // TODO Auto-generated method stub
//        post.setModifyTime(new Date());
//        if (post.getCreateTime() == null) {
//            post.setCreateTime(new Date());
//        }
//        if (StringUtils.isBlank(post.getCommentStatus())) {
//            post.setCommentStatus(Post.CommentStatus.OPEN);
//        }
//        if (StringUtils.isBlank(post.getStatus())) {
//            post.setStatus(Post.Status.PUBLISH);
//        }
//        if (post.getReplys() == null) {
//            post.setReplys(new Long(0));
//        }
//        if (post.getIsTop() == null) {
//            post.setIsTop(false);
//        }
//        update(post);
//    }
//
//    @Override
//    public void updatePostReplys(Long postId) {
//        // TODO Auto-generated method stub
//        if (postId != null) {
//            executeUpdate("update Post set replys = (select count(*) from Comment comment where comment.status = ? and comment.post.id = ?) where id = ?", new Object[] { Comment.Status.APPROVED, postId, postId });
//        }
//    }
//
//    @Override
//    public void updatePostViews(Long postId) {
//        // TODO Auto-generated method stub
//        if (postId != null) {
//            executeUpdate("update Post post set post.views = (post.views + 1) where post.id = ?", postId);
//        }
//    }
//
//    @Override
//    public String getPostUrlByCommentId(Long commentId) {
//        // TODO Auto-generated method stub
//        String queryString = "select post.url from Post post, Comment comment where comment.post.id = post.id and comment.id = ?";
//        Object url = getHibernateTemplate().uniqueResult(queryString, commentId);
//        return url == null ? "" : url.toString();
//    }
//
//    @Override
//    public Post getPostByComment(Long commentId) {
//        // TODO Auto-generated method stub
//        String queryString = "select post from Post post, Comment comment where comment.post.id = post.id and comment.id = ?";
//        return uniqueResult(queryString, commentId);
//    }
//
//    @Override
//    public void clearTrash() {
//        // TODO Auto-generated method stub
//        String hql = "delete Post post where post.status = ?";
//        executeUpdate(hql, Post.Status.TRASH);
//    }
//
//    @Override
//    public boolean hasPermisstion(Long postId, String password) {
//        // TODO Auto-generated method stub
//        Post post = get(postId);
//        if (StringUtils.isBlank(post.getPassword())) {
//            return true;
//        } else if (post.getPassword().equals(password)) {
//            return true;
//        }
//        return false;
//    }
//
//    @Override
//    public void movePostCatalog(Long fromCatalog, Long toCatalog) {
//        // TODO Auto-generated method stub
//        Session session = getSession();
//        try {
//            // //查出已经存在的主键,防止主键冲突
//            Query query1 = session.createQuery("select pc1.PK.post.id from PostCatalog pc1 where pc1.PK.catalog.id = ?");
//            query1.setParameter(0, toCatalog);
//            List list = query1.list();
//            String ids = "";
//            for (int i = 0; i < list.size(); i++) {
//                ids += list.get(i).toString();
//                if (i < list.size() - 1) {
//                    ids += ",";
//                }
//            }
//
//            Query query = session.createQuery("update PostCatalog pc set pc.PK.catalog.id = ? where pc.PK.catalog.id = ? and pc.PK.post.id not in (" + ids + ")");
//
//            query.setParameter(0, toCatalog);
//            query.setParameter(1, fromCatalog);
//            query.executeUpdate();
//        } catch (Exception e) {
//            // TODO: handle exception
//            e.printStackTrace();
//        }
//    }
//
//    @Override
//    public void setPostTop(Long id, boolean top) {
//        // TODO Auto-generated method stub
//        if (id == null) {
//            return;
//        }
//        executeUpdate("update Post post set post.isTop = ? where post.id = ?", new Object[] { top, id });
//    }
//
//    @Override
//    public void remove(Post post) {
//        // TODO Auto-generated method stub
//        attachmentService.deleteAttachment(post.getId(), Attachment.AttachFrom.FROM_POST);
//        super.remove(post);
//    }
//
//    @Override
//    public void remove(Long... ids) {
//        // TODO Auto-generated method stub
//        for (Long id : ids) {
//            attachmentService.deleteAttachment(id, Attachment.AttachFrom.FROM_POST);
//            super.remove(id);
//        }
//    }
//
//    @Override
//    public List<Post> recent(int nums) {
//        // TODO Auto-generated method stub
//        Query query = getSession().createQuery("select post from Post post where post.status = ? order by post.createTime desc");
//        query.setParameter(0, Post.Status.PUBLISH);
//        query.setMaxResults(nums);
//        return query.list();
//    }
//
//    @Override
//    public List<Post> hot(int nums, Date start, Date end) {
//        // TODO Auto-generated method stub
//        Session session = getSession();
//        Criteria c = session.createCriteria(Post.class);
//        c.add(Restrictions.eq("status", Post.Status.PUBLISH));
//        c.addOrder(org.hibernate.criterion.Order.desc("views"));
//        if (start != null) {
//            c.add(Restrictions.ge("createTime", start));
//        }
//        if (end != null) {
//            c.add(Restrictions.le("createTime", end));
//        }
//        return c.list();
//    }
//
//    @Override
//    public List<Post> top(final int nums) {
//        // TODO Auttop method stub
//        Query query = getSession().createQuery("select post from Post post where post.status = ? and post.isTop = true");
//        query.setParameter(0, Post.Status.PUBLISH);
//        if (nums != 0) {
//            query.setMaxResults(nums);
//        }
//        return query.list();
//    }
//
//}
